/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ PersistenceServicesMock.java
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: Camilo Alvarez
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.catalogo.servicios;

import com.losalpes.catalogo.entities.RegistroVenta;
import com.losalpes.catalogo.entities.TipoMueble;
import com.losalpes.catalogo.excepciones.InvalidOperationException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 * Implementación de los servicios de persistencia que se le prestan al sistema.
 * @author Camilo Alvarez
 */
@Stateless
public class PersistenceServicesRemote implements IPersistenceServicesRemote {

    // -----------------------------------------------
    // Atributos
    // -----------------------------------------------

    /**
     * Servicios locales de persistencia
     */
    @EJB
    private IPersistenceServices persistanceLocal;

    // -----------------------------------------------
    // Constructor
    // -----------------------------------------------

    /**
     * Constructor de la clase.
     */
    public PersistenceServicesRemote() {
    }

    public void create(Object obj) throws InvalidOperationException{
        persistanceLocal.create(obj);
    }

    public void update(Object obj) {
        persistanceLocal.update(obj);
    }

    public void delete(Object obj) throws InvalidOperationException {
        persistanceLocal.delete(obj);
    }

    public List findAll(Class c) {
        List l = persistanceLocal.findAll(c);
        ArrayList ret = new ArrayList();
        for(int e=0;e<l.size();e++){
            Object obj = l.get(e);
            convertirListas(obj);
            ret.add(obj);

        }
        return l;
    }

    private void convertirListas(Object objeto){
        for(Field f:objeto.getClass().getDeclaredFields()){
            try {
                boolean acc = f.isAccessible();
                f.setAccessible(true);
                Object campo = f.get(objeto);
                if(campo instanceof List){
                    ArrayList lista = new ArrayList();
                    List l = (List)campo;
                    for(Object obj:l)lista.add(obj);
                    f.set(objeto,(List)lista);
                }
                f.setAccessible(acc);
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(PersistenceServicesRemote.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(PersistenceServicesRemote.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public Object findById(Class c, Object id) {
        Object obj = persistanceLocal.findById(c, id);
        return obj;
    }

    public List generateRepoteDiarioVentas(TipoMueble tipo, Date fecIni, Date fecFin) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<RegistroVenta> generateRepoteProductoMasVendido(Date fecIni, Date fecFin) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<RegistroVenta> generateReporteComprasCliente(String documento) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
